# -*- coding: utf-8 -*-
# 为博客数据库添加示例数据

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from datetime import datetime, timedelta
import hashlib
import sys
import os

# 添加父目录到路径，以便导入模型
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)

# 导入所有数据模型
try:
    from 创建mysql表 import (
        User, Category, Location, Article, Comment, Image,
        UserLike, Role, UserRole, SystemConfig,
        engine, SessionLocal
    )
except ImportError as e:
    print(f"导入模型失败: {e}")
    print("请确保 创建mysql表.py 文件存在且可以正常导入")
    sys.exit(1)

def hash_password(password):
    """生成密码哈希值"""
    return hashlib.sha256(password.encode()).hexdigest()

def add_sample_data():
    """添加示例数据到所有表"""
    session = SessionLocal()

    try:
        print("🚀 开始添加示例数据...")
        print("-" * 50)

        # 1. 添加角色数据 (如果不存在)
        print("📋 添加角色数据...")
        roles_data = [
            {
                'name': 'super_admin',
                'display_name': '超级管理员',
                'description': '系统最高权限，可以管理角色和系统配置',
                'level': 4,
                'permissions': {
                    "article": {"create": True, "read": True, "update": ["all"], "delete": ["all"]},
                    "comment": {"create": True, "read": True, "update": ["all"], "delete": ["all"]},
                    "user": {"read": ["all"], "update": ["all"], "manage": True},
                    "system": {"config": True, "role_manage": True}
                }
            },
            {
                'name': 'admin',
                'display_name': '管理员',
                'description': '内容管理权限，可以管理所有内容、用户管理',
                'level': 3,
                'permissions': {
                    "article": {"create": True, "read": True, "update": ["all"], "delete": ["all"]},
                    "comment": {"create": True, "read": True, "update": ["all"], "delete": ["all"]},
                    "user": {"read": ["all"], "update": ["all"], "manage": True}
                }
            },
            {
                'name': 'user',
                'display_name': '普通用户',
                'description': '基础权限用户，可以浏览内容、发表评论',
                'level': 1,
                'permissions': {
                    "article": {"read": True},
                    "comment": {"create": True, "read": True, "update": ["own"], "delete": ["own"]},
                    "user": {"read": ["public"], "update": ["own"]}
                }
            }
        ]

        for role_data in roles_data:
            existing_role = session.query(Role).filter(Role.name == role_data['name']).first()
            if not existing_role:
                role = Role(**role_data)
                session.add(role)

        session.commit()
        print("✅ 角色数据添加完成")

        # 2. 添加用户数据
        print("👥 添加用户数据...")
        users_data = [
            {
                'username': 'admin',
                'email': 'admin@blog.com',
                'password_hash': hash_password('admin123'),
                'nickname': '系统管理员',
                'avatar': '/uploads/avatars/admin.jpg',
                'bio': '博客系统管理员，负责系统维护和内容管理。',
                'phone': '13800138000',
                'status': 1
            },
            {
                'username': 'editor01',
                'email': 'editor@blog.com',
                'password_hash': hash_password('editor123'),
                'nickname': '内容编辑',
                'avatar': '/uploads/avatars/editor.jpg',
                'bio': '专业的内容编辑，致力于为读者提供高质量的文章。',
                'phone': '13800138001',
                'status': 1
            },
            {
                'username': 'user01',
                'email': 'user@blog.com',
                'password_hash': hash_password('user123'),
                'nickname': '普通用户',
                'avatar': '/uploads/avatars/user.jpg',
                'bio': '热爱阅读和分享的博客用户。',
                'phone': '13800138002',
                'status': 1
            }
        ]

        user_objects = []
        for user_data in users_data:
            existing_user = session.query(User).filter(User.username == user_data['username']).first()
            if not existing_user:
                user = User(**user_data)
                session.add(user)
                user_objects.append(user)
            else:
                user_objects.append(existing_user)

        session.commit()
        print("✅ 用户数据添加完成")

        # 3. 添加用户角色关联
        print("🔗 添加用户角色关联...")
        # 获取角色ID
        super_admin_role = session.query(Role).filter(Role.name == 'super_admin').first()
        admin_role = session.query(Role).filter(Role.name == 'admin').first()
        user_role = session.query(Role).filter(Role.name == 'user').first()

        # 获取用户ID
        admin_user = session.query(User).filter(User.username == 'admin').first()
        editor_user = session.query(User).filter(User.username == 'editor01').first()
        normal_user = session.query(User).filter(User.username == 'user01').first()

        user_roles_data = [
            {
                'user_id': admin_user.id,
                'role_id': super_admin_role.id,
                'assigned_by': admin_user.id,
                'status': 1
            },
            {
                'user_id': editor_user.id,
                'role_id': admin_role.id,
                'assigned_by': admin_user.id,
                'status': 1
            },
            {
                'user_id': normal_user.id,
                'role_id': user_role.id,
                'assigned_by': admin_user.id,
                'status': 1
            }
        ]

        for user_role_data in user_roles_data:
            existing_user_role = session.query(UserRole).filter(
                UserRole.user_id == user_role_data['user_id'],
                UserRole.role_id == user_role_data['role_id']
            ).first()
            if not existing_user_role:
                user_role_obj = UserRole(**user_role_data)
                session.add(user_role_obj)

        session.commit()
        print("✅ 用户角色关联添加完成")

        # 4. 添加分类数据
        print("📁 添加分类数据...")
        categories_data = [
            {
                'name': '技术分享',
                'description': '分享编程技术、开发经验和技术心得',
                'sort_order': 1,
                'status': 1
            },
            {
                'name': '生活随笔',
                'description': '记录生活点滴，分享生活感悟',
                'sort_order': 2,
                'status': 1
            },
            {
                'name': '旅行游记',
                'description': '记录旅行足迹，分享美好风景',
                'sort_order': 3,
                'status': 1
            }
        ]

        category_objects = []
        for category_data in categories_data:
            existing_category = session.query(Category).filter(Category.name == category_data['name']).first()
            if not existing_category:
                category = Category(**category_data)
                session.add(category)
                category_objects.append(category)
            else:
                category_objects.append(existing_category)

        session.commit()
        print("✅ 分类数据添加完成")

        # 5. 添加地理位置数据
        print("📍 添加地理位置数据...")
        locations_data = [
            {
                'name': '北京天安门',
                'address': '北京市东城区东长安街',
                'latitude': 39.9042,
                'longitude': 116.4074,
                'country': '中国',
                'province': '北京市',
                'city': '北京市',
                'district': '东城区'
            },
            {
                'name': '上海外滩',
                'address': '上海市黄浦区中山东一路',
                'latitude': 31.2397,
                'longitude': 121.4900,
                'country': '中国',
                'province': '上海市',
                'city': '上海市',
                'district': '黄浦区'
            },
            {
                'name': '深圳市民中心',
                'address': '深圳市福田区福中三路',
                'latitude': 22.5431,
                'longitude': 114.0579,
                'country': '中国',
                'province': '广东省',
                'city': '深圳市',
                'district': '福田区'
            }
        ]

        location_objects = []
        for location_data in locations_data:
            existing_location = session.query(Location).filter(Location.name == location_data['name']).first()
            if not existing_location:
                location = Location(**location_data)
                session.add(location)
                location_objects.append(location)
            else:
                location_objects.append(existing_location)

        session.commit()
        print("✅ 地理位置数据添加完成")

        # 6. 添加文章数据
        print("📝 添加文章数据...")
        articles_data = [
            {
                'title': 'Python Web开发入门指南',
                'content': '本文将详细介绍如何使用Python进行Web开发，包括Flask和Django框架的使用方法...',
                'summary': '全面介绍Python Web开发的基础知识和实践技巧',
                'author_id': admin_user.id,
                'category_id': category_objects[0].id,
                'cover_image': '/uploads/articles/python-web.jpg',
                'tags': 'Python,Web开发,Flask,Django',
                'view_count': 1250,
                'like_count': 89,
                'comment_count': 15,
                'status': 1,
                'is_top': 1,
                'location_id': location_objects[0].id,
                'published_at': datetime.now() - timedelta(days=7)
            },
            {
                'title': '漫步在春天的公园里',
                'content': '今天天气特别好，阳光明媚，微风习习。我决定去公园走走，感受春天的气息...',
                'summary': '记录春日公园漫步的美好时光',
                'author_id': editor_user.id,
                'category_id': category_objects[1].id,
                'cover_image': '/uploads/articles/spring-park.jpg',
                'tags': '生活,春天,公园,散步',
                'view_count': 680,
                'like_count': 45,
                'comment_count': 8,
                'status': 1,
                'is_top': 0,
                'location_id': location_objects[1].id,
                'published_at': datetime.now() - timedelta(days=3)
            },
            {
                'title': '西安古城文化之旅',
                'content': '西安，这座有着三千多年历史的古城，承载着中华文明的厚重历史...',
                'summary': '探索西安古城的历史文化和旅游攻略',
                'author_id': normal_user.id,
                'category_id': category_objects[2].id,
                'cover_image': '/uploads/articles/xian-travel.jpg',
                'tags': '旅行,西安,历史,文化',
                'view_count': 920,
                'like_count': 67,
                'comment_count': 12,
                'status': 1,
                'is_top': 0,
                'location_id': location_objects[2].id,
                'published_at': datetime.now() - timedelta(days=5)
            }
        ]

        article_objects = []
        for article_data in articles_data:
            existing_article = session.query(Article).filter(Article.title == article_data['title']).first()
            if not existing_article:
                article = Article(**article_data)
                session.add(article)
                article_objects.append(article)
            else:
                article_objects.append(existing_article)

        session.commit()
        print("✅ 文章数据添加完成")

        # 7. 添加评论数据
        print("💬 添加评论数据...")
        comments_data = [
            {
                'article_id': article_objects[0].id,
                'user_id': editor_user.id,
                'content': '非常好的Python教程，讲解详细，对初学者很有帮助！',
                'like_count': 12,
                'ip_address': '192.168.1.100',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                'status': 1
            },
            {
                'article_id': article_objects[1].id,
                'user_id': admin_user.id,
                'content': '春天真的很美，你的文字让我也想去公园走走了。',
                'like_count': 8,
                'ip_address': '192.168.1.101',
                'user_agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
                'status': 1
            },
            {
                'article_id': article_objects[2].id,
                'user_id': editor_user.id,
                'content': '西安确实是个很有历史底蕴的城市，下次我也要去看看！',
                'like_count': 15,
                'ip_address': '192.168.1.102',
                'user_agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15',
                'status': 1
            }
        ]

        for comment_data in comments_data:
            comment = Comment(**comment_data)
            session.add(comment)

        session.commit()
        print("✅ 评论数据添加完成")

        # 8. 添加图片数据
        print("🖼️ 添加图片数据...")
        images_data = [
            {
                'filename': 'python-logo.png',
                'file_path': '/uploads/images/2024/09/python-logo.png',
                'file_size': 128000,
                'file_type': 'image/png',
                'width': 800,
                'height': 600,
                'user_id': admin_user.id,
                'usage_type': 1,
                'status': 1
            },
            {
                'filename': 'spring-flower.jpg',
                'file_path': '/uploads/images/2024/09/spring-flower.jpg',
                'file_size': 256000,
                'file_type': 'image/jpeg',
                'width': 1200,
                'height': 800,
                'user_id': editor_user.id,
                'usage_type': 1,
                'status': 1
            },
            {
                'filename': 'xian-wall.jpg',
                'file_path': '/uploads/images/2024/09/xian-wall.jpg',
                'file_size': 384000,
                'file_type': 'image/jpeg',
                'width': 1600,
                'height': 1200,
                'user_id': normal_user.id,
                'usage_type': 1,
                'status': 1
            }
        ]

        for image_data in images_data:
            image = Image(**image_data)
            session.add(image)

        session.commit()
        print("✅ 图片数据添加完成")

        # 9. 添加点赞数据
        print("👍 添加点赞数据...")
        user_likes_data = [
            {
                'user_id': editor_user.id,
                'target_type': 1,  # 文章
                'target_id': article_objects[0].id
            },
            {
                'user_id': normal_user.id,
                'target_type': 1,  # 文章
                'target_id': article_objects[1].id
            },
            {
                'user_id': admin_user.id,
                'target_type': 2,  # 评论
                'target_id': 1
            }
        ]

        for like_data in user_likes_data:
            existing_like = session.query(UserLike).filter(
                UserLike.user_id == like_data['user_id'],
                UserLike.target_type == like_data['target_type'],
                UserLike.target_id == like_data['target_id']
            ).first()
            if not existing_like:
                user_like = UserLike(**like_data)
                session.add(user_like)

        session.commit()
        print("✅ 点赞数据添加完成")

        # 10. 添加系统配置数据
        print("⚙️ 添加系统配置数据...")
        config_data = [
            {
                'config_key': 'site_name',
                'config_value': 'Liao的个人博客',
                'description': '网站名称',
                'type': 'string'
            },
            {
                'config_key': 'site_description',
                'config_value': '记录生活，分享技术，传递价值',
                'description': '网站描述',
                'type': 'string'
            },
            {
                'config_key': 'max_upload_size',
                'config_value': '10485760',
                'description': '最大上传文件大小（字节）',
                'type': 'int'
            }
        ]

        for config in config_data:
            existing_config = session.query(SystemConfig).filter(SystemConfig.config_key == config['config_key']).first()
            if not existing_config:
                system_config = SystemConfig(**config)
                session.add(system_config)

        session.commit()
        print("✅ 系统配置数据添加完成")

        print("-" * 50)
        print("🎉 所有示例数据添加完成！")
        print("\n📊 数据统计:")
        print(f"- 用户: {session.query(User).count()} 条")
        print(f"- 角色: {session.query(Role).count()} 条")
        print(f"- 分类: {session.query(Category).count()} 条")
        print(f"- 位置: {session.query(Location).count()} 条")
        print(f"- 文章: {session.query(Article).count()} 条")
        print(f"- 评论: {session.query(Comment).count()} 条")
        print(f"- 图片: {session.query(Image).count()} 条")
        print(f"- 点赞: {session.query(UserLike).count()} 条")
        print(f"- 用户角色关联: {session.query(UserRole).count()} 条")
        print(f"- 系统配置: {session.query(SystemConfig).count()} 条")

        print("\n👤 管理员账户信息:")
        print("- 用户名: admin")
        print("- 密码: admin123")
        print("- 权限: 超级管理员")
        print("- 邮箱: admin@blog.com")

    except Exception as e:
        session.rollback()
        print(f"❌ 添加示例数据失败: {e}")
        import traceback
        traceback.print_exc()
        raise e
    finally:
        session.close()

def main():
    """主函数"""
    print("🚀 开始为博客数据库添加示例数据...")
    print(f"📡 数据库连接信息已配置")
    print("-" * 50)

    try:
        add_sample_data()
    except Exception as e:
        print(f"💥 操作失败: {e}")
        return False

    return True

if __name__ == "__main__":
    main()

#👤 管理员账户信息:
# - 用户名: admin
# - 密码: admin123
# - 权限: 超级管理员
# - 邮箱: admin@blog.com
#